import cityData from "@/config/regions.json"

/**
 * 函数防抖 (只执行最后一次点击)
 * @param fn
 * @param delay
 * @returns {Function}
 * @constructor
 */
export const Debounce = (fn, t) => {
	const delay = t || 500
	let timer
	return function() {
		const args = arguments
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(() => {
			timer = null
			fn.apply(this, args)
		}, delay)
	}
}
/**
 * 函数节流
 * @param fn
 * @param interval
 * @returns {Function}
 * @constructor
 */
export const Throttle = (fn, t) => {
	let last
	let timer
	const interval = t || 500
	return function() {
		const args = arguments
		const now = +new Date()
		if (last && now - last < interval) {
			clearTimeout(timer)
			timer = setTimeout(() => {
				last = now
				fn.apply(this, args)
			}, interval)
		} else {
			last = now
			fn.apply(this, args)
		}
	}
}

/**
 * 手机号脱敏函数
 * @param phoneNumber
 * @returns {String}
 */
export const maskPhoneNumber = (phoneNumber) => {
	return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}

/**
 * 通过code查找城市，包含父级
 * @param code
 * @returns {Object}
 */
export const findNameByCodeWithPath = (code, data = cityData, path = []) => {
	for (let item of data) {
		// 将当前节点的 name 添加到路径中
		path.push(item.name);
		if (item.code == code) {
			// 如果找到目标 code，返回当前节点的 name 和路径
			return {
				name: item.name,
				path
			};
		}
		if (item.children) {
			// 在子节点中递归查找
			let found = findNameByCodeWithPath(code, item.children, path);
			if (found) {
				// 如果在子节点中找到，直接返回结果
				return found;
			} else {
				// 如果在子节点中没找到，需要将当前节点从路径中移除，回溯到上一层
				path.pop();
			}
		} else {
			// 如果没有子节点，同样需要将当前节点从路径中移除，回溯到上一层
			path.pop();
		}
	}
	return null;
}